/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.foxinline.servico;

import br.com.foxinline.enums.Relatorio;
import br.com.foxinline.modelo.Pessoa;
import br.com.foxinline.modelo.Protesto;
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.Stateless;
import javax.persistence.Query;
import org.jrimum.bopepo.BancosSuportados;
import org.jrimum.bopepo.Boleto;
import org.jrimum.bopepo.pdf.Files;
import org.jrimum.bopepo.view.BoletoViewer;
import org.jrimum.domkee.comum.pessoa.endereco.CEP;
import org.jrimum.domkee.comum.pessoa.endereco.Endereco;
import org.jrimum.domkee.comum.pessoa.endereco.UnidadeFederativa;
import org.jrimum.domkee.financeiro.banco.febraban.*;
import org.jrimum.domkee.financeiro.banco.febraban.Titulo.Aceite;

/**
 *
 * @author roniere
 */
@Stateless
public class ProtestoServico extends ServicoGenerico<Protesto> {

    public ProtestoServico() {
        super(Protesto.class);
    }

    public List<Protesto> pesquisar(Protesto protesto, Pessoa interessado) {
        String sql = "Select p from Protesto p";

        if (protesto != null) {
            if (protesto.getProtocolo() != null && (protesto.getProtocolo().getId() != null || protesto.getProtocolo().getCliente() != null)) {
                sql += " JOIN p.protocolo protocolo";
            }

            if (protesto.getProtocolo() != null && protesto.getProtocolo().getCliente() != null) {
                sql += " JOIN protocolo.cliente c";
            }
        }

        sql += " WHERE ";
        if (protesto != null) {
            if (protesto.getProtocolo() != null && protesto.getProtocolo().getId() != null) {
                sql += " protocolo.id = :protocolo and ";
            }

            if (protesto.getProtocolo() != null && protesto.getProtocolo().getCliente() != null
                    && protesto.getProtocolo().getCliente().getNome() != null
                    && !protesto.getProtocolo().getCliente().getNome().isEmpty()) {
                sql += " cliente.nome like :interessado and ";
            }
        }

        sql += " 1 = 1";
        Query query = getEntityManager().createQuery(sql);

        if (protesto != null) {
            if (protesto.getProtocolo() != null && protesto.getProtocolo().getId() != null) {
                query.setParameter("protocolo", protesto.getProtocolo().getId());
            }

            if (protesto.getProtocolo() != null && protesto.getProtocolo().getCliente() != null
                    && protesto.getProtocolo().getCliente().getNome() != null
                    && !protesto.getProtocolo().getCliente().getNome().isEmpty()) {
                query.setParameter("interessado", protesto.getProtocolo().getCliente().getNome());
            }
        }
        sql += " 1 = 1";
        return query.getResultList();
    }

    public void emitirIntimacao(){
        RelatorioServico.gerarRelatorio( null, null, Relatorio.PROTESTO_INTIMACAO);
    }
    
    public void emitirBoleto() {
        Cedente cedente = new Cedente("Cartório do 1º Ofício ", "00.000.208/0001-00");


        Sacado sacado = new Sacado("Roniere da Silva Sousa", "045.166.763-89");

        // Informando o endereço do sacado.
        Endereco enderecoSac = new Endereco();
        enderecoSac.setUF(UnidadeFederativa.PI);
        enderecoSac.setLocalidade("Parnaíba");
        enderecoSac.setCep(new CEP("64211-125"));
        enderecoSac.setBairro("Centro");
        enderecoSac.setLogradouro("Rua poeta dos programas");
        enderecoSac.setNumero("1");
        sacado.addEndereco(enderecoSac);


        // Informando dados sobre a conta bancária do título.
        ContaBancaria contaBancaria = new ContaBancaria(BancosSuportados.BANCO_DO_BRASIL.create());
        contaBancaria.setNumeroDaConta(new NumeroDaConta(40608, "2"));
        contaBancaria.setCarteira(new Carteira(30));
        contaBancaria.setAgencia(new Agencia(23, "X"));


        Titulo titulo = new Titulo(contaBancaria, sacado, cedente);
        titulo.setNumeroDoDocumento("123456");
        titulo.setNossoNumero("99345678912");
        titulo.setDigitoDoNossoNumero("5");
        titulo.setValor(BigDecimal.valueOf(0.23));
        titulo.setDataDoDocumento(new Date());
        titulo.setDataDoVencimento(new Date());
        titulo.setTipoDeDocumento(TipoDeTitulo.CH_CHEQUE);
        titulo.setAceite(Aceite.A);
        titulo.setDesconto(new BigDecimal(0.05));
        titulo.setDeducao(BigDecimal.ZERO);
        titulo.setMora(BigDecimal.ZERO);
        titulo.setAcrecimo(BigDecimal.ZERO);
        titulo.setValorCobrado(BigDecimal.ZERO);
        
        Boleto boleto = new Boleto(titulo);
        
        boleto.setLocalPagamento("Pagável em qualquer agência bancária ou pag contas");
        boleto.setInstrucaoAoSacado("");
        boleto.setInstrucao1("");

        BoletoViewer boletoViewer = new BoletoViewer(boleto);
        try {
            RelatorioServico.genReport(Files.fileToBytes(boletoViewer.getPdfAsFile("boleto.pdf")));
        } catch (IOException ex) {
            Logger.getLogger(ProtestoServico.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
